/*
Problem Description
相信大家都听说一个“百岛湖”的地方吧，百岛湖的居民生活在不同的小岛中，当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖，发展首先要解决的问题当然是交通问题，政府决定实现百岛湖的全畅通！
经过考察小组RPRush对百岛湖的情况充分了解后，决定在符合条件的小岛间建上桥，所谓符合条件，就是2个小岛之间的距离不能小于10米，也不能大于1000米。当然，为了节省资金，只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
Input
输入包括多组数据。输入首先包括一个整数T(T <= 200)，代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数，接下来是C组坐标，代表每个小岛的坐标，这些坐标都是 0 <= x, y <= 1000的整数。
Output
每组输入数据输出一行，代表建桥的最小花费，结果保留一位小数。如果无法实现工程以达到全部畅通，输出”oh!”.
Sample Input
2
2
10 10
20 20
3
1 1
2 2
1000 1000
Sample Output
1414.2
oh!
 */
package com.yuan.algorithms.training20150807;

import java.io.BufferedInputStream;
import java.util.Scanner;

/**
 * @author YouYuan
 * @eMail E-mail:1265161633@qq.com
 * @Time 创建时间：2015年8月21日 上午10:29:00
 * @Explain 说明:错误答案，不知道哪里错了。。。。
 */
public class 图论_畅通工程再续 {

	static Scanner in = new Scanner(new BufferedInputStream(System.in));
	static final int S = 1002;
	static double[][] map = new double[S][2];
	static double[][] arc = new double[S][110];
	static boolean[] mark = new boolean[S];
	static int C;
	static final double MAX = 0xfffffff;

	public static void main(String[] args) {
		while (in.hasNext()) {
			int t = in.nextInt();
			while (--t >= 0) {
				C = in.nextInt();
				initialise();
				for (int i = 0; i < C; i++) {
					map[i][0] = in.nextInt();
					map[i][1] = in.nextInt();
				}
				structure();
				prim();
			}
		}
	}

	private static void structure() {
		for (int i = 0; i < C; i++) {
			for (int j = i + 1; j < C; j++) {
				double distance = Math.sqrt(Math.pow(map[i][0] - map[j][0], 2) + Math.pow(map[i][1] - map[j][1], 2));
				if (distance >= 10 && distance <= 1000) {
					arc[i][j] = arc[j][i] = distance;
				}
			}
		}
	}

	private static void prim() {
		mark[0] = true;
		double sum = 0.0;
		for (int i = 0; i < C - 1; i++) {
			double min = MAX;
			int index = -1;
			for (int j = 0; j < C; j++) {
				if (!mark[j] && arc[0][j] < min) {
					min = arc[0][j];
					index = j;
				}
			}
			if (index == -1) {
				System.out.println("oh!");
				return;
			}
			mark[index] = true;
			sum += (min * 100.0);
			for (int j = 0; j < C; j++) {
				if (!mark[i] && arc[0][j] > arc[index][j]) {
					arc[0][j] = arc[index][j];
				}
			}
		}
		System.out.printf("%.1f", sum);
		System.out.println();
	}

	private static void initialise() {
		for (int i = 0; i < C; i++) {
			mark[i] = false;
			for (int j = 0; j < C; j++) {
				arc[i][j] = MAX;
			}
		}
	}

}
